# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html
import datetime
import csv
import json

# useful for handling different item types with a single interface
from itemadapter import ItemAdapter

from test import password


class MoviePipeline:
    keys = ['片名', '清晰度', '类型', '主演', '导演', '国家/地区', '时长', '语言', '年代', '更新时间', '详细介绍', '途径']
    def open_spider(self, spider):
        """
        1.创建csv表格记录数据
        2.将爬虫数据追加至表单里面（
        encoding=‘utf-8-sig’使用utf8并添加bom（字节顺序标记），确保不乱码，
        newline禁用换行符自动转换，避免CSV出现多余空行）
        csv.writer写入器，将数据写入表格
        csv_writer.writerow(self.keys)写入表头，将keys作为表头写入，writerow()方法一次写入一行数据
        :param spider:
        :return:
        """
        csv_filename = "{}.csv".format(datetime.datetime.now().strftime("%Y%m%d%H%M%S"))
        self.file = open(csv_filename, 'a', encoding='utf-8-sig', newline='')
        self.csv_writer = csv.writer(self.file)
        self.csv_writer.writerow(self.keys)

    def process_item(self, item, spider):
        """
        1.定义一个空列表装载item的值item_values
        2.循环遍历keys的元素对应的值并追加到item_values，且get函数的优点是，即使键不存在可以按预先设定的默认值取返回
        :param item: item是爬虫抓取的数据返回到此处进行执行
        :param spider:爬虫的名称
        :return: 抓取的数据返回给item
        """
        item_values = []
        for key in self.keys[:-1]:
           value = item.get(key, ' ')
           item_values.append(value)
        item_values.append(spider.name)
        self.csv_writer.writerow(item_values)
        return item

    def close_spider(self, spider):
        self.file.close()

import redis

class MovieinfoRedisPipeline:
    def open_spider(self, spider):
        try:
            # 添加password参数（如果设置了密码）
            self.conn = redis.Redis(
                host='192.168.106.131',
                port=6379,
                password='admin',  # 如果设置了密码，取消注释这行
                decode_responses=False  # 保持为False，因为我们存储的是json字符串
            )
            # 测试连接
            self.conn.ping()
            spider.logger.info("Successfully connected to Redis.")
        except Exception as e:
            spider.logger.error(f"Failed to connect to Redis: {e}")
            raise  # 重新抛出异常，让爬虫停止

    def process_item(self, item, spider):
       if item.get('片名', False):
           self.conn.set(item['片名'], json.dumps(item))
       return item

    def close_spider(self, spider):
        self.conn.close()

import pymysql

class MovieinfoMysqlPipeline:
    database = ''  #数据库
    table = ''     #表格
    def open_spider(self, spider):
        self.table = spider.settings.get('MYSQL_TABLE', 'movie_info') #查找表名为MYSQL_TABLE的表，如果没有则使用设定值movie_info
        print(f"表名设置为: {self.table}")

        self.conn = pymysql.connect(
            host = '192.168.106.131',
            db = 'test',
            user = 'root',
            password = 'admin',
            charset = 'utf8mb4',
        )
        self.cursor = self.conn.cursor()  #创建游标（类似指针），用于后续执行SQL语句
        # print("数据库连接成功!")
        self.create_table()

    def create_table(self):
        """创建表格sql语句"""
        create_table_sql = f"""
            CREATE TABLE IF NOT EXISTS `{self.table}` (
                `id` INT PRIMARY KEY AUTO_INCREMENT,  
                `片名` VARCHAR(256),
                `清晰度` VARCHAR(256),
                `类型` VARCHAR(256),
                `主演` VARCHAR(256), 
                `导演` VARCHAR(256),
                `国家/地区` VARCHAR(256),
                `时长` VARCHAR(256),
                `语言` VARCHAR(256),
                `年代` VARCHAR(256),
                `更新时间` VARCHAR(256),
                `详细介绍` TEXT
            )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        """
        # print("生成的SQL语句为：", create_table_sql)

        self.cursor.execute(create_table_sql)
        self.conn.commit()

    def process_item(self, item, spider):
        # 处理列表类型字段（主演、导演），转换为JSON字符串
        def process_field(value):
            if isinstance(value, list):
                return json.dumps(value, ensure_ascii=False)  # 将列表转为JSON字符串
            elif value == 'None' or value is None:
                return None  # 将None转为数据库NULL
            else:
                return str(value).replace("'", "''")  # 转义单引号
        # 使用参数化查询
        insert_sql = f"""
                       INSERT INTO {self.table}
                       (`片名`, `清晰度`, `类型`, `主演`, `导演`, `国家/地区`, `时长`, `语言`, `年代`, `更新时间`, `详细介绍`)
                       VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
                   """
        # insert_sql = f"""insert into {self.table}
        # (`片名`, `清晰度`, `类型`, `主演`, `导演`, `国家/地区`, `时长`, `语言`, `年代`, `更新时间`, `详细介绍`)
        # (
        # '{item["片名"]}', '{item["清晰度"]}', '{item["类型"]}', '{item["主演"]}',
        # '{item["导演"]}', '{item["国家/地区"]}', '{item["时长"]}', '{item["语言"]}',
        # '{item["年代"]}', '{item["更新时间"]}', '{item["详细介绍"]}'
        # )
        # """
        # print(insert_sql)
        # self.cursor.execute(insert_sql)
        # self.conn.commit()
        # return item

        # 准备参数值
        values = (
            process_field(item["片名"]),
            process_field(item["清晰度"]),
            process_field(item["类型"]),
            process_field(item["主演"]),
            process_field(item["导演"]),
            process_field(item["国家/地区"]),
            process_field(item["时长"]),
            process_field(item["语言"]),
            process_field(item["年代"]),
            process_field(item["更新时间"]),
            process_field(item["详细介绍"])
        )


        self.cursor.execute(insert_sql, values)
        self.conn.commit()
        print(f"成功插入: {item['片名']}")
        return item



    def close_spider(self, spider):
        pass